﻿using System;
using System.Collections.Generic;
using CRC.Clases;
using NHibernate;
using CRC.NHibernate;
using CRC.Inspecciones.Dominio.Clases;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class Controlador_NuevaZona
    {

        public IList<Salon> VisualizarSalonesPotenciales()
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Salon> potenciales = null;

            try {
                
                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                potenciales = session.CreateQuery("from Salon s where s.Zona is null").List<Salon>();
                tx.Commit();

                return potenciales;
                
            } catch(HibernateException he){
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }

        public IList<Persona> VisualizarInspectores()
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Persona> infoInspectores = null;
            string hqlQuery = "from Persona p where p.Tipo.Descripcion='inspector'";

            try
            {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();
                
                infoInspectores = session.CreateQuery(hqlQuery).List<Persona>();

                tx.Commit();
                return infoInspectores;

            }
            catch (HibernateException ex)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw ex;
            }
        }

        public Zona NuevaZona(string pstrNombre, int pintInspector, IList<Salon> salonesAsignados)
        {
            ISession session = null;
            ITransaction tx = null;
            string query = String.Empty;

            try {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();
                query = "from Zona z where z.Nombre='" + pstrNombre + "'";
                IList<Zona> res = session.CreateQuery(query).List<Zona>();

                if (res.Count > 0 )
                {
                    throw new Exception("¡Ya existe una zona con nombre " + pstrNombre + "!");
                }
                query = "from Zona z where z.Inspector.Id=" + pintInspector;
                IList<Zona> res2 = session.CreateQuery(query).List<Zona>();

                if (res2.Count > 0)
                {
                    throw new Exception("¡El inspector indicado ya tiene asignada una zona para inspección!");
                }

                Zona zona = new Zona();
                zona.Nombre = pstrNombre;
                Persona inspector = (Persona)session.Load(typeof(Persona), pintInspector);
                
                //inspector.ZonaAsignada = zona;
                zona.Inspector = inspector;
                
                //Quitamos los salones (para quitar los que se hayan desasignado)
                zona.Salones.Clear();
                //Añadimos los asignados
                foreach (Salon s in salonesAsignados)
                {
                    zona.añadirSalon(s);
                }
                session.Save(zona);
                tx.Commit();

                return zona;

            } catch (HibernateException he){
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }

        }
    }
}
